package pacote;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import pacote.Ip;

public class Subrede {
	private int mascara;
	private Ip ipBase;
	private List<Ip> ips = new ArrayList<Ip>();
	private List<Ip> ips_possiveis = new ArrayList<Ip>();
	private Ip ipRoteadorDeBorda;
	private HashMap<Ip, Mac> tabelaIp_mac;
	
	public Subrede(Ip ipBase, String mascara) {
		this.ipBase = ipBase;
		this.mascara = Integer.parseInt(mascara.substring(1));
		this.tabelaIp_mac = new HashMap<Ip, Mac>();
		geraIps();
	}

	public int getMascara() {
		return mascara;
	}

	public void setMascara(String mascara) {
		this.mascara = Integer.parseInt(mascara.substring(1));
	}
	
	private void geraIps(){
		String string_ipBase = ipBase.getIpBynaryString().substring(0, mascara);
		String string_ipCompleto;
		for(int i = 0; i < Math.pow(2, (32 - mascara)); i++){
			String string_ipComplemento = Integer.toBinaryString(i);
			for(int j = string_ipComplemento.length(); j < (32 - mascara) ; j++ ) string_ipComplemento = '0' + string_ipComplemento;
			
			string_ipCompleto = string_ipBase + string_ipComplemento;
			Integer ip_numero_1 = Integer.parseInt(string_ipCompleto.substring(0, 8), 2);
			Integer ip_numero_2 = Integer.parseInt(string_ipCompleto.substring(8, 16), 2);
			Integer ip_numero_3 = Integer.parseInt(string_ipCompleto.substring(16, 24), 2);
			Integer ip_numero_4 = Integer.parseInt(string_ipCompleto.substring(24, 32), 2);
			string_ipCompleto = ip_numero_1 + "." + ip_numero_2 + "." + ip_numero_3 + "." + ip_numero_4;
			ips.add(new Ip(string_ipCompleto));
			ips_possiveis.add(new Ip(string_ipCompleto));
		}
	}
	
	public Ip getIp(boolean isRoteadorDeBorda){
		Ip ip = null;
		if(ips.size() > 0){
			ip = ips.get(0);
			ips.remove(0);
		}
		
		if(isRoteadorDeBorda)
			ipRoteadorDeBorda = ip;
		
		return ip;
	}

	public Ip getIpRoteadorDeBorda(){
		return ipRoteadorDeBorda;
	}
	
	public void recebeIpDevolvido(Ip ip){
		ips.add(ip);
		tabelaIp_mac.remove(ip);
	}
	
	public Mac retornaMac(Ip ip){
		return tabelaIp_mac.get(ip);
	}
	
	public void preencheTabelaIp_mac(Ip ip, Mac mac){
		tabelaIp_mac.put(ip, mac);
	}
	
	public boolean pertenceASubrede(Ip ip){
		return ips_possiveis.contains(ip);
	}

	public Ip getIpBase() {
		return ipBase;
	}

	public void setIpBase(Ip ipBase) {
		this.ipBase = ipBase;
	}

	public void setIpRoteadorDeBorda(Ip ipRoteadorDeBorda) {
		this.ipRoteadorDeBorda = ipRoteadorDeBorda;
	}
	
	
}
